# coding:utf-8
from django.db import transaction
from rest_framework import serializers

from MSB_ERP.utils.get_inventory import get_inventory
from goods_info.models import GoodsModel, GoodsInventoryModel, AttachmentModel
from goods_info.serializer.units_serializer import UnitsSerializer
from goods_info.serializer.category_serializer import GoodsCategorySerializer
from goods_info.serializer.attachment_serializer import AttachmentsSerializer


class CooodsInventorySerializer(serializers.ModelSerializer):
    # 商品的库存，序列化器
    class Meta:
        model = GoodsInventoryModel
        fields = '__all__'


class GoodsBaseSerializer(serializers.ModelSerializer):
    """
    新增货品，修改货品的序列化和反序列化
    """
    # 商品对应的多个，商品库存对象，因为有很多库存
    inventory_list = CooodsInventorySerializer(many=True, required=True)

    class Meta:
        model = GoodsModel
        fields = '__all__'

    def create(self, validated_data):
        # 该新增商品的库存对象的列表，一个商品有多个库存
        # 库存先插入进去，在查询商品，所以要把库存拿出来，不然插入商品时又插入库存，因为商品序列化器是嵌套库存的
        item_list = validated_data.pop('inventory_list')  # 拿出库存，validated_data里面没有inventory_list了
        # 插入商品信息，里面没有库存，插入商品信息才会自动生成一个ID
        with transaction.atomic():
            goods = GoodsModel.objects.create(**validated_data)
            for item in item_list:
                # 新建时。当前库存=初始库存，创建一个cur_inventory属性=init_inventory
                item['cur_inventory'] = item.get('init_inventory', 0)
                GoodsInventoryModel.objects.create(goods=goods, **item)
        return goods

    def update(self, instance, validated_data):
        # 该新增商品的库存对象的列表，一个商品有多个库存
        # 库存先插入进去，在查询商品，所以要把库存拿出来，不然插入商品时又插入库存，因为商品序列化器是嵌套库存的
        item_list = validated_data.pop('inventory_list')
        with transaction.atomic():#把下面的代码封装成事务
            for item in item_list:
                GoodsInventoryModel.objects.filter(goods_id=instance.id, warehouse__name=item['warehouse_name']).update(
                    lowest_inventory=item.get('lowest_inventory', 0),
                    highest_inventory=item.get('highest_inventory', 0)
                )
            # 调用父类修改，用序列化器

            goods = super(GoodsBaseSerializer, self).update(instance=instance, validated_data=validated_data)
        return goods


class GoodsGetSerializer(serializers.ModelSerializer):
    """
    商品查询的序列化器
    目标：
        1、把商品的单位——所有信息展示出来
        2、展示商品信息所属的商品类别——所有信息展示出来
        3、展示商品的所有附件图片——所有图片信息展示出来
        4、展示商品的所有仓库中的库存信息
    """
    # 单位所有信息
    units = UnitsSerializer(read_only=True)
    # 商品类别
    category = GoodsCategorySerializer(read_only=True)

    images_list = serializers.SerializerMethodField(read_only=True)
    #商品的总库存
    cur_inventory = serializers.SerializerMethodField(read_only=True)

    # 商品对应的多个，商品库存对象，因为有很多库存
    inventory_list = CooodsInventorySerializer(many=True, read_only=True)

    class Meta:
        model = GoodsModel
        fields = "__all__"

    def get_images_list(self, obj):
        result = []  # 返回的列表，列表中是多个字典(每个字典就是一个附件)
        if obj.images_list:
            # images_list属性是由多个附件的ID组成，中间使用逗号分割
            ids = obj.images_list.split(',')
            if ids:
                for i in ids:
                    image = AttachmentModel.objects.get(id=int(i))
                    ser = AttachmentsSerializer(instance=image)
                    result.append(ser.data)
        return result

    def get_cur_inventory(self,obj):
        #商品的当前库存在很多地方需要看
        return get_inventory(obj.id)
